home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 2000 November: Tool Chest / Dev.CD Nov 00 TC Disk 1.toast / Sample Code / Archive / QuickTime / QuickTime VR / Make QTVR Object / Open⁄Close.c < prev    next >
Encoding:
Text File  |  2000-09-28  |  4.7 KB  |  183 lines  |  [TEXT/MPCC]

  1. //
  2. //         This is sample code which will make QTVR object movies from Linear QuickTime movies.
  3. //
  4. //        © 1991-1996 Apple Computer, Inc.  All rights reserved.
  5. //
  6.  
  7. #include    "MakeQTVRObject.h"
  8. #include    "extern.h" 
  9.  
  10. OSErr    OpenMovie(FSSpec    *theFSSpec)
  11. {
  12.     Rect            windowBounds = {40,10,240,330};
  13.     Boolean            wasChanged;
  14.     MovieInstance    *newInstance;
  15.     OSErr            err;
  16.     Rect            controllerBox;
  17.     long              i=0;
  18.     Rect            movieRect;
  19.     
  20.     // First, we create a new Movie Instance
  21.     newInstance = (MovieInstance*)NewPtrClear(sizeof(MovieInstance));
  22.     if(!newInstance)
  23.         {
  24.         UserMessage("\pNot enough memory.");
  25.         return 8;
  26.         }
  27.     newInstance->spec = *theFSSpec;
  28.     
  29.     // Create a new window
  30.     newInstance->window=(CWindowPtr) NewCWindow(nil, &windowBounds, theFSSpec->name , false, noGrowDocProc, (WindowPtr)-1, true, 0);
  31.     if(!newInstance->window)
  32.         {
  33.         UserMessage("\pNot enough memory.");
  34.         DisposePtr((Ptr)newInstance);
  35.         return 1;
  36.         }
  37.     SetGWorld(newInstance->window,nil);
  38.         
  39.     // Open the movie    
  40.     err = OpenMovieFile(theFSSpec,&newInstance->movieResFile,fsRdWrPerm);
  41.     if(err != noErr)
  42.         {
  43.         UserMessage("\pCould not open the movie.");
  44.         DisposePtr((Ptr)newInstance);
  45.         DisposeWindow((WindowPtr)newInstance->window);
  46.         return 2;
  47.         }
  48.     
  49.     err = NewMovieFromFile(&newInstance->movie,newInstance->movieResFile,&newInstance->movieResID,nil,newMovieActive,&wasChanged);
  50.     //CloseMovieFile(newInstance->movieResFile);
  51.     if(err != noErr)
  52.         {
  53.         UserMessage("\pCould not create movie from movie file.");
  54.         DisposeWindow((WindowPtr)newInstance->window);
  55.         DisposePtr((Ptr)newInstance);
  56.         return 3;
  57.         }
  58.         
  59.     // Determine the size of the movie
  60.     GetMovieBox(newInstance->movie,&movieRect);
  61.     OffsetRect(&movieRect,-movieRect.left,-movieRect.top);
  62.     SetMovieBox(newInstance->movie,&movieRect);
  63.     
  64.     if(!ValidMovieType(newInstance))
  65.         {
  66.         DisposeWindow((WindowPtr)newInstance->window);
  67.         DisposeMovie(newInstance->movie);
  68.         DisposePtr((Ptr)newInstance);
  69.         return 4;
  70.         }
  71.     //Create a movie controller
  72.     newInstance->movieController = NewMovieController(newInstance->movie,&movieRect,mcTopLeftMovie);
  73.     if(!newInstance->movieController)
  74.         {
  75.         UserMessage("\pCould not create movie controller.");
  76.         DisposeWindow((WindowPtr)newInstance->window);
  77.         DisposeMovie(newInstance->movie);
  78.         DisposePtr((Ptr)newInstance);
  79.         return 5;
  80.         }
  81.     
  82.     // Resize the window to fit the movie and the controller
  83.     MCGetControllerBoundsRect(newInstance->movieController,&controllerBox);
  84.     SizeWindow((WindowPtr)newInstance->window,controllerBox.right,controllerBox.bottom,true);
  85.     ShowWindow((WindowPtr)newInstance->window);
  86.     
  87.     AttachMovieToWindow((WindowPtr)newInstance->window,newInstance);
  88.     
  89.     MCIdle (newInstance->movieController);
  90.     return 0;
  91. }
  92.  
  93. OSErr    ReopenMovie(MovieInstance    *theInstance)
  94. {
  95.     Rect            movieRect;
  96.     
  97.     if(!theInstance->movieController)
  98.         return 1;
  99.     
  100.     // Kill the current movie controller
  101.     DisposeMovieController(theInstance->movieController);
  102.         
  103.     // Determine the size of the movie
  104.     GetMovieBox(theInstance->movie,&movieRect);
  105.     OffsetRect(&movieRect,-movieRect.left,-movieRect.top);
  106.     SetMovieBox(theInstance->movie,&movieRect);
  107.     
  108.     
  109.     //Create a movie controller
  110.     theInstance->movieController = NewMovieController(theInstance->movie,&movieRect,mcTopLeftMovie);
  111.     if(!theInstance->movieController)
  112.         {
  113.         UserMessage("\pCould not create movie controller.");
  114.         DisposeWindow((WindowPtr)theInstance->window);
  115.         DisposeMovie(theInstance->movie);
  116.         DisposePtr((Ptr)theInstance);
  117.         return 5;
  118.         }
  119.     
  120.     MCIdle (theInstance->movieController);
  121.     return 0;
  122. }
  123.  
  124. void    CloseMovie(WindowPtr    theWindow)
  125. {
  126.     MovieInstance    *theInstance;
  127.     CWindowPtr        newWindow;
  128.     if(!theWindow)
  129.         return;
  130.         
  131.     theInstance = GetMovieInstanceFromWindow(theWindow);
  132.     DisposeWindow(theWindow);
  133.     if(!theInstance)
  134.         return;
  135.     CloseMovieFile(theInstance->movieResFile);    
  136.     if(theInstance->movieController)
  137.         DisposeMovieController(theInstance->movieController);
  138.     if(theInstance->movie)    
  139.         DisposeMovie(theInstance->movie);
  140.     
  141.     if(newWindow = (CWindowPtr)FrontWindow())
  142.         SetGWorld(newWindow,nil);
  143.         
  144.     DisposePtr((Ptr)theInstance);
  145. }
  146.  
  147.  
  148. Boolean    GetAMovie(FSSpec    *theSpec)
  149. {
  150.     SFTypeList            theTypeList = {'MooV'};
  151.     StandardFileReply    theReply;
  152.     
  153.     StandardGetFilePreview(0L, 1, theTypeList, &theReply);
  154.     
  155.     *theSpec = theReply.sfFile;
  156.     
  157.     return (theReply.sfGood);
  158. }
  159.  
  160. Boolean    ValidMovieType(MovieInstance    *theInstance)
  161. {
  162.     OSType controllerSubType;
  163.     
  164.     theInstance->isObjectMovie = false;
  165.     
  166.     if (GetUserDataItem(GetMovieUserData(theInstance->movie), &controllerSubType, sizeof(controllerSubType), 'ctyp', 0) != noErr)
  167.         return true;
  168.         
  169.     if (controllerSubType == 'stna')
  170.         {
  171.         theInstance->isObjectMovie = true;
  172.         return true;
  173.         }
  174.     else if (controllerSubType == 'stpn' || controllerSubType == 'STpn')
  175.         {
  176.         UserMessage("\pMakeQTVRObject cannot display panoramic movies.");
  177.         return false;
  178.         }
  179.         
  180.     return true;
  181. }
  182.  
  183.